package study.java.thread04;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* @Name: SellTicketRunnable
* @Description: 电影院多窗口卖票多线程测试类
* 说明：
* 	虽然可以理解同步代码块和同步方法的锁对象问题，但是我们并没有直接看到在哪里加上了锁，在哪里释放了锁
* 	为了更清晰的表达如何加锁和释放锁，JDK5以后，提供了一个新的锁对象Lock。
* 	Lock:：
* 		void lock() : 获取锁
* 		void unlock() : 释放锁
* 	实现类 : ReentrantLock
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-9 下午4:02:47 
* @Version: V1.0
 */
public class SellTicketRunnable implements Runnable {
	
	//总共100张票
	private static int tickets = 100 ;
	//定义锁对象
	private Lock lock = new ReentrantLock() ;

	@Override
	public void run() {
		while(true) {
			try {
				//加锁
				lock.lock() ;
				if(tickets > 0) {
					System.out.println(Thread.currentThread().getName() + "正在出售第[" + (tickets--) + "]张票.");
				}
				//每卖一张票，休眠0.1秒
				try {
					Thread.sleep(100) ;
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} finally {
				//解锁
				lock.unlock() ;
			}
		}
	}
	
}
